package com.chat.server;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ChatServer extends Thread {

	// ArrayList 객체를 여러 스레드가 안전하게 공유할 수 있는 동기화된 리스트로 만듭니다
	static List<PrintWriter> list = Collections.synchronizedList( new ArrayList<PrintWriter>() );
	Socket socket;
	PrintWriter writer;
	public ChatServer( Socket socket )
	{	
		//서버 시작시 생성된 소켓을 세팅 한다.
		this.socket = socket;
		try
		{
			//soket에 정의되어 있는 port로 OutputStream객체를 생성한다.
			writer = new PrintWriter( socket.getOutputStream() );
			list.add( writer );
		}
		catch( Exception e )
		{
			System.out.println( e.getMessage() );
		}
	}
	public void run()
	{
		String name = null;
		try
		{	
			//soket에 있는 InputSteam정보를 읽는다			
			BufferedReader reader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
			
			// 수신된 첫번째 문자열을 대화명으로 사용하기 위해 저장합니다
			name = reader.readLine();		
			sendAll( "#" +name+ "님이 들어오셨습니다.");
			
			while( true )
			{
				//쓰레드가 살아있는 동안 buffer에 있는 정보를 읽는다.
				String str = reader.readLine();
				if( str == null )
				{
					break;
				}
				sendAll( name + ">" +str );	// 수신된 메시지 앞에 대화명을 붙여서 모든 클라이어언트로 송신됩니다.
			}
		}
		catch( Exception e )
		{
			System.out.println( e.getMessage() );
		}
		finally
		{
			list.remove( writer );
			sendAll( "#"+name+"님이 나가셨습니다" );
			try
			{
				socket.close();
			}
			catch( Exception e )
			{
			}
		}
	}
	private void sendAll( String str )
	{	// 서버에 연결된 모든 클라이언트로 똑같은 메시지를 보낸다.
		for( PrintWriter writer : list )		
		{
			//9001번 포트로 연결되 client에 대해 서버 메세지를 보낸다(Client Receiver에서 해당 메세지를 받는다.)
			writer.println(str);
			writer.flush();
		}
	}
}
